package ManagerImage.display;

import ManagerImage.entity.SlideShow;
import ManagerImage.Utils.DirUtil;
import ManagerImage.Utils.FileUtil;
import ManagerImage.Utils.IconUtil;
import ManagerImage.Utils.StatusUtil;
import ManagerImage.entity.ContextMenuManager;
import ManagerImage.entity.Thumbnail;
import javafx.application.Platform;
import javafx.concurrent.Task;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Node;
import javafx.scene.control.*;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.*;
import javafx.scene.text.Font;
import javafx.scene.text.Text;

import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * 应⽤程序场景的根节点
 */
public class RootPane extends BorderPane {

    /**
     * 作用区域:RootPane  ContextMenuManager
     */
    public static  FlowPane thumbnails = new FlowPane(); // 图⽚展示窗格

    /**
     * 作用区域:RootPane  ContextMenuManager Thumbnail
     */
    public static  List<File> selectedImages = new ArrayList<>(); // 用于存储选中的图片文件
    public static  Label statusLabel;//底部状态标签
    public static  Label currentDirectoryLabel; // 当前目录信息标签
    /**
     * 作用区域:RootPane Thumbnail
     */
    public static  String currentPath; // 当前目录路径
    public static int imageCount = 0; // 图片个数
    public static long totalSize = 0; // 图片总大小
    /**
     * 作用区域:RootPane
     */
    public static  Task<Integer> task; // 加载图⽚的任务
    public static  ExecutorService executor = Executors.newCachedThreadPool();
    /**
     * 工具
     * 作用区域:RootPane
     */
    public static  FileUtil fileUtil = new FileUtil();
    public static  StatusUtil statusUtil=new StatusUtil();
    public static  IconUtil iconUtil=new IconUtil();
    public static  DirUtil   dirUtil=new DirUtil();
    public static  int loadedCount = 0; // 记录已加载的图像数量
    /**
     * 构造
     */
    public RootPane() {initLayout();}
    /**
     * 构建图形⽤户界⾯及监听器
     */
     void initLayout(){
        //中间部分
        ScrollPane scrollPane = new ScrollPane(thumbnails);
        //ScrollPane scrollPane = new ScrollPane();
        scrollPane.setFitToHeight(true);
        scrollPane.setFitToWidth(true);
        scrollPane.setVbarPolicy(ScrollPane.ScrollBarPolicy.ALWAYS);
        StackPane centerLayout = new StackPane();
        // 创建欢迎图片的ImageView
        ImageView welcomeImageView = new ImageView(new Image("resource/welcome.png")); // 加载你的欢迎图片
        welcomeImageView.setFitWidth(300); // 设置图像宽度（根据需要）
        welcomeImageView.setFitHeight(300); // 设置图像高度（根据需要）;
        Label  welcomeLabel = new Label("欢迎使用");
        welcomeLabel.setGraphic(welcomeImageView);
        welcomeLabel.setContentDisplay(ContentDisplay.TOP);
         // 将欢迎图片添加到StackPane
        centerLayout.getChildren().add(welcomeLabel);
        thumbnails.setVisible(false);
        centerLayout.getChildren().add(thumbnails);

        scrollPane.setContent(centerLayout);

        //顶部
        HBox topBar = new HBox();
        topBar.setPadding(new Insets(5));
        topBar.setSpacing(20);
        topBar.getStyleClass().add("top-bar");
        topBar.setAlignment(Pos.CENTER_LEFT);

        // 创建“我的电脑”标签
        Label computerLabel = new Label("我的电脑");
        iconUtil.setIconInLabel_left(computerLabel,new Image("resource/computer.png"));
        topBar.getChildren().add(computerLabel);

        Label space=new Label("            ");
        // 创建顶部当前目录信息标签
        currentDirectoryLabel = new Label("当前目录: ");
        iconUtil.setIconInLabel_left(currentDirectoryLabel,new Image("resource/folder.png"));
        topBar.getChildren().addAll(space,currentDirectoryLabel);

        // 创建占位符
        Region spacer = new Region();
        HBox.setHgrow(spacer, Priority.ALWAYS); // 让占位符扩展以填充空间
        topBar.getChildren().add(spacer); // 添加占位符到顶部栏

        // 创建“浏览”按钮(含图片）
        Button browseButton = new Button("浏览");
        iconUtil.setIconInButton(browseButton,new Image("resource/surf.png"));
        topBar.getChildren().add(browseButton); // 将按钮添加到顶部栏的右侧

        // 创建左侧树形视图
        TreeItem<String> rootItem = new TreeItem<>("Computer");
        TreeView<String> treeView = new TreeView<>(rootItem);
        File[] rootDirs = File.listRoots();
        for (File rootDir : rootDirs) {
            TreeItem<String> rootDirectory = new TreeItem<>(rootDir.getPath());
            iconUtil.setIconInView_right(rootDirectory,new Image("resource/folder.png"));
            rootItem.getChildren().add(rootDirectory);
            dirUtil.addSubDirectories(rootDirectory, rootDir);
        }
        treeView.setShowRoot(false);
        treeView.setPrefHeight(800);

        // 创建底部状态信息标签
        statusLabel = new Label("欢迎使用图片浏览器");
        iconUtil.setIconInLabel_left(statusLabel,new Image("resource/status.png"));
        statusLabel.setPadding(new Insets(3));
        statusLabel.setMaxHeight(15);
        statusLabel.setAlignment(Pos.CENTER_LEFT);

        // 添加树形视图和缩略图区域到根布局
        this.setTop(topBar);
        this.setLeft(treeView);
        this.setCenter(scrollPane);
        this.setBottom(statusLabel); // 将状态标签放在底部
        this.setPadding(new Insets(15));
        // 创建右键菜单管理器
        ContextMenuManager contextMenuManager = new ContextMenuManager();
        //右键菜单
        thumbnails.setOnMousePressed(event -> handleContainerMousePressed(event, contextMenuManager));

        // 树形目录的“选择”事件
//        treeView.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) -> {
//            if (newValue != null) {
//                welcomeLabel.setVisible(false); // 隐藏欢迎图片
//                thumbnails.setVisible(true); // 显示缩略图
//                thumbnails.getChildren().clear();
//                selectedImages.clear();
//                currentPath=newValue.getValue();//用于slideshow
//                String selectedPath = newValue.getValue();
//                File directory = new File(selectedPath);
//                if(newValue.getChildren().isEmpty()) dirUtil.addSubDirectories(newValue,directory);
//                initImages();
//            }
//        });
         treeView.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) -> {
             if (task != null && task.isRunning()) {
                 task.cancel();
             }
             if (newValue != null) {
                 welcomeLabel.setVisible(false); // 隐藏欢迎图片
                 thumbnails.setVisible(true); // 显示缩略图

                 Platform.runLater(() -> {
                     thumbnails.getChildren().clear();
                 });
                 selectedImages.clear();
                 currentPath=newValue.getValue();//用于slideshow

                 String selectedPath = newValue.getValue();
                 File directory = new File(selectedPath);
                 if(newValue.getChildren().isEmpty()) dirUtil.addSubDirectories(newValue,directory);

                 initImages();
             }
         });

        // “幻灯片播放”事件
        browseButton.setOnAction(e -> {
            if(currentPath==null)return ;
            File currentdir=new File(currentPath);
            File[] currentImageFiles=currentdir.listFiles(file -> file.isFile() && fileUtil.isImageFile(file));
            if(currentImageFiles!=null&&currentImageFiles.length>0)new SlideShow(currentImageFiles[0]);// 打开幻灯片播放窗口显示第一张图
        });
    }
    /**
     * 更新以及初始化全部图片
     */
//    public static void initImages() {
//        File currentdir=new File(currentPath);
//        currentDirectoryLabel.setText(new File(currentPath).getName() + " | " + imageCount + "张图片");
//        if (currentdir != null) {
//            // 先检查有⽆正在运⾏的线程(任务), 如果有，就取消它。
//            if (task != null && task.isRunning()) {
//                task.cancel();
//            }
//            thumbnails.getChildren().clear(); // 清空原来显示的图⽚
//            newTask(fileUtil.getImageFiles(currentdir)); // 创建⼀个新任务
//            executor.execute(task); // 执⾏任务
//        }
//
//    }
    public static void initImages() {
        File currentdir=new File(currentPath);
        String currentDirPath = currentPath; // 获取当前路径的快照
        //currentDirectoryLabel.setText(currentdir.getName() + " | " + imageCount + "张图片");
        Platform.runLater(() -> {
            currentDirectoryLabel.setText(currentdir.getName() + " | " + imageCount + "张图片");
        });
        //currentDirectoryLabel.setText(new File(currentPath).getName() + " | " + imageCount + "张图片");
        if (currentdir.exists()) {
            // 先检查有⽆正在运⾏的线程(任务), 如果有，就取消它。
            if (task != null && task.isRunning()) {
                task.cancel(true);
            }
            thumbnails.getChildren().clear(); // 清空原来显示的图⽚
            newTask(fileUtil.getImageFiles(currentdir),currentDirPath); // 创建⼀个新任务
            executor.execute(task); // 执⾏任务
        }

    }
    /**
     * 创建加载图像的任务
     * @param imageFiles 任务需要加载的图像数组
     */
//    public static void newTask(File[] imageFiles) {
//        task = new Task<Integer>() {
//            @Override
//            protected Integer call() throws Exception {
//                loadedCount = 0; // 记录已加载的图像数量
//                imageCount = imageFiles.length;
//                totalSize = 0; // 记录所有图像的总大小
//
//                // 计算所有图像的总大小
//                for (File imageFile : imageFiles) {
//                    totalSize += imageFile.length();
//                }
//
//                // 使用一个简单的并行加载机制
//                for (File imageFile : imageFiles) {
//                    if (this.isCancelled()) {
//                        break; // 检测到任务被取消，退出循环
//                    }
//
//                    // 创建缩略图
//                    Thumbnail thumbnail = new Thumbnail(imageFile);
//                    loadedCount++;
//
//                    // 在后台线程中异步更新图像
//                    Platform.runLater(() -> {
//                        thumbnails.getChildren().add(thumbnail); // 立即添加缩略图
//                        statusUtil.updateStatus(statusLabel, String.format("图片数量: %d, 已经加载: %d ", imageCount, loadedCount));
//                    });
//
//                    // 控制加载速率，减少线程占用
//                    Thread.sleep(15); // 可以适当调整这个间隔
//                }
//                return loadedCount; // 返回已加载的图像数量
//            }
//        };
//
//        // 设定任务状态处理
//        task.setOnFailed(e -> {
//            statusUtil.updateStatus(statusLabel, "任务加载失败");
//            task = null;
//            thumbnails.getChildren().clear(); // 清空缩略图显示
//
//        });
//
//        task.setOnCancelled(e -> {
//            statusUtil.updateStatus(statusLabel, "任务加载中断");
//            task = null;
//            thumbnails.getChildren().clear(); // 清空缩略图显示
//        });
//
//        task.setOnSucceeded(e -> {
//            statusUtil.updateStatus(statusLabel, "加载完成: " + new File(currentPath).getName() + " | 图片个数: " + imageCount + " | 总大小: " + fileUtil.formatSize(totalSize));
//            currentDirectoryLabel.setText(new File(currentPath).getName() + " | " + imageCount + "张图片");
//            task = null;
//        });
//    }
    public static void newTask(File[] imageFiles,String taskcurrentDirPath) {
        task = new Task<Integer>() {
            private final String taskPath = taskcurrentDirPath;
            @Override
            protected Integer call() throws Exception {
                loadedCount = 0; // 记录已加载的图像数量
                imageCount = imageFiles.length;
                totalSize = 0; // 记录所有图像的总大小

                // 计算所有图像的总大小
                for (File imageFile : imageFiles) {
                    totalSize += imageFile.length();
                }

                // 使用一个简单的并行加载机制
                for (File imageFile : imageFiles) {
                    if (this.isCancelled()) break; // 检测到任务被取消，退出循环
                    // 创建缩略图
                    Thumbnail thumbnail = new Thumbnail(imageFile);
                    loadedCount++;

                    // 在后台线程中异步更新图像
                    Platform.runLater(() -> {
                        if (currentPath.equals(taskPath)) {
                            thumbnails.getChildren().add(thumbnail); // 立即添加缩略图
                            statusUtil.updateStatus(statusLabel, String.format("图片数量: %d, 已经加载: %d ", imageCount, loadedCount));
                        }
                    });
                }
                return loadedCount; // 返回已加载的图像数量
            }
        };

        // 设定任务状态处理
        task.setOnFailed(e -> {
            statusUtil.updateStatus(statusLabel, "任务加载失败");
            task = null;
            thumbnails.getChildren().clear(); // 清空缩略图显示

        });

        task.setOnCancelled(e -> {
            statusUtil.updateStatus(statusLabel, "任务加载中断");
            task = null;
            thumbnails.getChildren().clear(); // 清空缩略图显示
        });

        task.setOnSucceeded(e -> {
            statusUtil.updateStatus(statusLabel, "加载完成: " + new File(currentPath).getName() + " | 图片个数: " + imageCount + " | 总大小: " + fileUtil.formatSize(totalSize));
            currentDirectoryLabel.setText(new File(currentPath).getName() + " | " + imageCount + "张图片");
            task = null;
        });
    }
    /**
     * 清除所有选中状态
     */
    public static void clearSelectedThumbnails() {
        // 遍历缩略图容器中的所有节点
        for (Node node : thumbnails.getChildren()) { // 使用 thumbnails 而不是 thumbnailContainer
            if (node instanceof Thumbnail) { // 检查是否为 Thumbnail 类型
                Thumbnail thumbnail = (Thumbnail) node;
                // 恢复默认样式
                thumbnail.setStyle("");
            }
        }
        selectedImages.clear(); // 清空选中列表
    }
    /**
     * 根据文件查找缩略图对象
     * @param imageFile
     * @return
     */
    public static Thumbnail findThumbnailByFile(File imageFile) {
        for (Node node : thumbnails.getChildren()) {
            if (node instanceof Thumbnail) {
                Thumbnail thumbnail = (Thumbnail) node;
                // 假设 Thumbnail 类有个方法可以返回其对应的 File
                if (thumbnail.getImageFile().equals(imageFile)) {
                    return thumbnail; // 返回找到的 Thumbnail
                }
            }
        }
        return null; // 如果未找到，则返回 null
    }
    /**
     * 空白区域以及右键鼠标点击事件
     * @param event
     * @param contextMenuManager
     */
    private void handleContainerMousePressed(MouseEvent event, ContextMenuManager contextMenuManager) {
        if (event.isSecondaryButtonDown()) {
            System.out.println("右键按下");
            contextMenuManager.setDirectory(new File(currentPath));
            contextMenuManager.getContextMenu().show(thumbnails, event.getScreenX(), event.getScreenY());
        } else if (event.isPrimaryButtonDown()) { // 左键按下
            contextMenuManager.getContextMenu().hide();
            // 确认是点击的空白区域
            if (event.getTarget() == thumbnails) {
                System.out.println("点击了缩略图容器的空白区域");
                clearSelectedThumbnails(); // 清空所有选中状态
                statusUtil.updateStatus(statusLabel, "已取消所有选择");
            }
        }
    }
    // getters
    public Task<Integer> getTask() {
        return task;
    }
    public ExecutorService getExecutor() {
        return executor;
    }
}